package com.xbai.spark.core

import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * 广播变量：分布式共享只读数据
  * 广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值，以供一个或多个Spark 操作使用。
  * 比如，如果你的应用需要向所有节点发送一个较大的只读查询表，甚至是机器学习算法中的一个很大的特征向量，
  * 广播变量用起来很顺手。 在多个并行操作中使用同一个变量，但是 Spark 会为每个任务分别发送。
  *
  * @author xbai
  * @Date 2021/1/4
  */
object Spark_Broadcast {

  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Broadcast")
    val sc = new SparkContext(conf)

    val rdd1 = sc.makeRDD(List((1, 1), (2, 2), (3, 3)))
    val list = List((1, 1), (2, 2), (3, 3))

    val broadcast: Broadcast[List[(Int, Int)]] = sc.broadcast(list)
    val resultRDD: RDD[(Int, (Int, Any))] = rdd1.map {
      case (key, value) => {
        var v2: Any = null
        for (elem <- broadcast.value) {
          if (key == elem._1) {
            v2 = elem._2
          }
        }
        (key, (value, v2))
      }
    }
    resultRDD.foreach(println)
  }
}
